/* 
 * File:   Utiles.h
 * Author: Gabriel Fainstein
 *
 * Created on 19 de mayo de 2013, 19:30
 */

#ifndef UTILES_H
#define	UTILES_H

#include <stdint.h>
#include <list>
#include <string>
#include <dirent.h>
#include <sys/stat.h>
#include <vector>
#include "common_Excepcion.h"

using namespace std;
using namespace TP;

typedef std::vector<std::string> LNombreArchivo;
typedef std::vector<std::string> LPathArchivo;

namespace TP { namespace Archivos { 

class FileUtils {
    
    public:
        static const unsigned int bytesPorChunk;
        
        FileUtils();

        bool ObtenerNombreArchivos(const std::string & path, 
                                   LNombreArchivo & l)  const;
        //Dado un path, devuelve una lista con los nombres de los archivos.
        //True en caso de exito, false si hubo problemas con el directorio. 

        bool ObtenerFullPathArchivo(const std::string & path, 
                                      LPathArchivo & l) const;
        //dado un path, devuelve una lista con el full path de cada archivo
        //True en caso de exito, false si hubo problemas con el directorio. 

        bool DirectorioExistente(const std::string & path);
        //dado un path, devuelve true si es un directorio existente, false
        //en caso contrario
        
        // Devuelve el chunk de datos correspondiente del archivo cuyo path
        // es filePath
        void ComputarChunk(uint8_t* &pData, size_t &pDataLongitud, const std::string& pRutaCompletaArchivo, unsigned int pNumeroChunk);
        
        // Intenta crear un nuevo directorio, representado por 'path'.
        // Devuelve true en caso exitoso.
        bool CrearDirectorio(const std::string& path);
        
        bool CrearArchivo (const string &pRutaCompletaArchivo);
        
        bool EliminarArchivo (const string &pRutaCompletaArchivo);

        // Devuelve el tamanho en bytes de un path.
        // En caso de error devuelve -1.
        double GetPathSize(const std::string& path);
        
        size_t CalcularCantidadChunks(const string &pRutaCompletaArchivo);
        
        string GetHash (const string& pRutaCompletaArchivo, const size_t pIndiceChunk);
        
        bool ArchivoExistente (const string & pRutaCompletaArchivo);
        
    private:
        
        FileUtils(const FileUtils&);
        
        FileUtils& operator=(const FileUtils&);       
};

}}


#endif	/* UTILES_H */

